//
//  MIPRenderer.h
//  V3d_Cocoa
//
//  Created by Y my on 11-4-23.
//  Copyright 2011 NJUST. All rights reserved.
//

#import "Renderer.h"
#import "MIPData.h"

typedef struct _Template
{
	char x_offset, y_offset;  // 当前像素相对于V1的投影的位移
	
	// 光线进出Cell的两点
	float rayX1, rayY1, rayZ1; // [0, 1]
	float rayX2, rayY2, rayZ2; // [0, 1]
	
	struct _Template* next;
}Template;


@interface MIPRenderer : Renderer {
	
	///////////////////////////////////////////////
	//   inherted from Renderer
	//
	//   // 数据
	//   unsigned char**** rawData;
	//   id volData;
	//   unsigned char channelCount;
	//
	//   // 视图
	//   unsigned short viewWidth, viewHeight; // 视图的宽和高，以像素为单位
	//   unsigned int backgroundColor;
	//
	//   // 设置
	//   unsigned char pixelPerEdge;  // Cell的一条边包含的像素数，包括两个顶点。用来控制输出图像的大小。范围为：[2，10]
	//   unsigned char levelLowBound, levelUpBound; // 色阶的上下界
	//   float distanceToAngle;  // distance * distanceToAngle = angle
	//
	//   投影时，一开始图像原点始终位于视图原点，再进行一些列变换：
	//   1. 将图像中心移到视图原点
	//   2. 进行旋转变换
	//   3. 将图像中心移回
	//   Matrix4* matMoveToOri;
	//   Matrix4* matScale;
	//   Matrix4* matRotate;
	//   Matrix4* matMoveBack;
	//   Matrix4* matFinalProj; // 计算投影数组时的最终转换矩阵
	//
	//   unsigned short imageWidth, imageHeight;
	//   RGB* entireImage; // 包含整幅图像的像素
	//
	//   unsigned int* viewImage;  // 最终输出的数据，在entireImage的基础上进行了平移和剪裁
	//
	/////////////////////////////////////////////
	
	// cell data ///////////////////////////////
	Bucket* sortedBucketInfo;
	unsigned int* sortedCellCoord;
	unsigned int totalCellCount;
	unsigned short totalBucketCount;
	
	
	// template data ///////////////////////////
	
	//----- 投影用的Cell ---------------------------------------------------------------
	//         v6                 v7        face1: (v0 v1 v3 v2)   face2: (v4 v5 v7 v6)  
	//          / -----------------|        face3: (v0 v1 v5 v4)   face4: (v2 v3 v7 v6)                        
	//        / |                / |        face5: (v0 v2 v6 v4)   face6: (v1 v3 v7 v5)               
	//      /__________________/   |                                         
	//   v4 |   |           v5 |   |        diagonal1: (v0 v1)   diagonal2: (v1 v6)     
	//      |   |              |   |        diagonal3: (v3 v4)   diagonal4: (v2 v5)     
	//      |   |_ _ _ _ _ _ _ | _ |                         
	//      |  / v2            |  / v3      z    y                                                             
	//      |/_________________|/           |  /                                                     
	//     v0                  v1           |/____ x                                                     
	//----------------------------------------------------------------------------------

	Matrix4* matTemplate; // 计算模版时的变换矩阵
	Template* templates[16]; // 16个模版链表

	
	
	// 正交投影之需要取相乘结果的x，y分量
	float* XimgFromX3D;
	float* XimgFromY3D;
	float* XimgFromZ3D;
	float* YimgFromX3D;
	float* YimgFromY3D;
	float* YimgFromZ3D;

}
- (id)initWithViewWidth:(unsigned short)width
				 Height:(unsigned short)height
		BackgroundColor:(RGB)color;

- (void)setVolData:(MIPData*)vData;

@end
